package bao;

import DBCon.DBCon;
import model.Book;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BookDao {
    private Connection con = null;
    private Statement st;
    private ResultSet rs;
    private PreparedStatement ps;
    DBCon dbcon = new DBCon();
    List<Book> books = new ArrayList<>();

    // 查询全部图书信息
    public List<Book> QueryAllBookInformation() {
        // 连接数据库成功

        con = dbcon.dbCon();
        String sql = "select * from book";
        try {
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                // 结果集对象获取数据库个字段的对象
                String name = rs.getString("bk_name");
                String price = rs.getString("bk_price");
                String isbn = rs.getString("bk_isbn");
                int id = rs.getInt("bk_id");
                String lables = rs.getString("bk_lables");
                String a_name = rs.getString("bk_a_name");
                String sales = rs.getString("bk_sales");
                String introduction = rs.getString("bk_introduction");
                String nums = rs.getString("bk_nums");
                String bk_public = rs.getString("bk_public");
                // 创建book对象  将各数据字段对象调用构造方法存入book对象
                Book book = new Book(name, price, isbn, id, lables, a_name, sales, introduction, nums, bk_public);
                books.add(book);
            }
            return books;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            dbcon.close();
        }
        return null;
    }

    // 根据图书名称删除图书信息
    public boolean DeleteBookByName(String bk_name) {
        con = dbcon.dbCon();
        String sql = "delete from book where bk_name=?";
        try {
            ps = con.prepareStatement(sql);
            ps.setString(1, bk_name);
            if (ps.executeUpdate() > 0) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            dbcon.close();
        }
        return false;
    }

    // 根据 书名 修改图书信息
    /*
     *       流程：
     *           1. bookupdate.jsp 用于修改图书信息
     *           2. UpdateBook_Servlet 获取bookupdate.jsp中表单各项字段 声明一个Book对象 将所有字段装入一个Book对象中
     *           3. Dao层创建UpdateBookByName(Book book,String bk_name) 方法  根据book对象获取需要修改的信息，根据name确定需要修改的对象
     *           4.创建 service 方法 封装dao层实现方法  并提供给servlet调用。
     *           5. 方法返回只需要返回布尔值类型 即可实现判断是否修改成功或者失败 成功重定向到bookinfo.jsp界面再次执行查询操作回显数据
     */
    public boolean UpdateBookByName(Book book,String bk_name) {
        // 调用公共类 创建数据库连接 返回 con 对象
        con = dbcon.dbCon();
        // 定义修改的数据库Sql语句
        String sql = "update book set bk_price=?,bk_isbn=?,bk_id=?,bk_lables=?,bk_a_name=?,bk_sales=?," +
                "bk_introduction=?,bk_nums=?,bk_public=? where bk_name=?";
        try{
            // 创建PreparedStatement对象 并预处理sql语句
            ps = con.prepareStatement(sql);
            // 将修改的值放入sql
            ps.setString(1,book.getBk_price());
            ps.setString(2,book.getBk_isbn());
            ps.setInt(3,book.getBk_id());
            ps.setString(4,book.getBk_lables());
            ps.setString(5,book.getBk_a_name());
            ps.setString(6,book.getBk_sales());
            ps.setString(7,book.getBk_introduction());
            ps.setString(8,book.getBk_nums());
            ps.setString(9,book.getBk_public());
            ps.setString(10,bk_name);
            // 执行sql 判断 如果为真则返回 true
            int flag = ps.executeUpdate();
            if(flag>0){
                return true;
            }
        } catch(Exception e){
            e.printStackTrace();
        }
                return false;
    }
//    添加Book信息
    /*
    *       流程：
    *           1. Dao层创建AddBookInformation(Book book)方法  将book参数传入Book 对象
    *           2. servce层调用Dao层方法返回一个boolean值.
    *           3.
    *
    *
    * */
    public boolean AddBookInformation(Book book){
        // 调用公共类 创建数据库连接 返回 con 对象
        con = dbcon.dbCon();
        // 定义sql语句
        String sql = "insert into book (bk_name ,bk_price,bk_isbn,bk_id,bk_lables,bk_a_name,bk_sales,bk_introduction,bk_nums,bk_public)" +
                " values(?,?,?,?,?,?,?,?,?,?)";
        System.out.println("图书名称："+book.getBk_name());
        try {
            // 预处理sql
            ps = con.prepareStatement(sql);
            // 获取值 传递给sql
            ps.setString(1,book.getBk_name());
            ps.setString(2,book.getBk_price());
            ps.setString(3,book.getBk_isbn());
            ps.setInt(4,book.getBk_id());
            ps.setString(5,book.getBk_lables());
            ps.setString(6,book.getBk_a_name());
            ps.setString(7,book.getBk_sales());
            ps.setString(8,book.getBk_introduction());
            ps.setString(9,book.getBk_nums());
            ps.setString(10,book.getBk_public());
            System.out.println("0");
            if(ps.executeUpdate()>0){
                System.out.println("hhh");
                return true;
            }
        } catch(Exception e) {
            e.printStackTrace();
        }finally {
            dbcon.close();
        }
        return false;
    }
//    根据字段 图书名称 查询图书信息
            /*
            *           流程：
            *               1.Dao层创建 QueryBookInfoByName(String bk_name) 方法 查询成功返回true 失败返回false
            *               2.service层 调用dao层的方法 返回 true false
            *               3.servlet层调用service 方法
            *               4.jsp页面 表单 提交 之后 跳转到 QueryInfoByNameServelt去 servlet获取表单的name值
            *               5.并创建service 层对象  调用按学号查询的方法 返回 true false
            *                  创建 Book 对象 将查询结果封装在对象中
            *               6.如果返回值为真 则跳转到 querybyname.jsp 页面 显示查询信息 否则 弹出查无此人！
            * */
            public List<Book> QueryBookInfoByName(String bk_name){
                // 调用公共类 创建数据库连接 返回 con 对象
                con = dbcon.dbCon();
                // 创建 bean 对象
                Book book = null;
                // 定义sql语句
          //      String sql ="select * from book where bk_name=?";
                // 预处理
                try{
                    // 定义sql语句
                    String sql ="select * from book where bk_name=?";
                ps = con.prepareStatement(sql);
                // 存入 参数值
                ps.setString(1,bk_name);
                // 执行sql 语句
                  rs =  ps.executeQuery();
                  if(rs.next()){
                      String name = rs.getString("bk_name");
                      String price = rs.getString("bk_price");
                      String isbn = rs.getString("bk_isbn");
                      int id = rs.getInt("bk_id");
                      String lables = rs.getString("bk_lables");
                      String a_name = rs.getString("bk_a_name");
                      String sales = rs.getString("bk_sales");
                      String introduction = rs.getString("bk_introduction");
                      String nums = rs.getString("bk_nums");
                      String Public = rs.getString("bk_public");
                      book = new Book(name, price, isbn, id, lables, a_name, sales, introduction, nums, Public);
                      books.add(book);
                  }
                    return books;
                } catch(Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

}
